/*
 * 文件名：serial_screen.cpp
 * 功能描述：串口屏幕通信和状态同步
 */
#include "serial_screen.h"
#include <Arduino.h>
#include "button.h"
#include "config.h"
#include "bsp_ble.h"
#include "buzzer.h"
#include "OTAUpdate.h"

// 初始化串口通信
HardwareSerial Serial4(2); // 使用硬件串口1进行通信

int data22[] = {
    1, // 单击
    1, // 编码器值
    1, // 双击
    0, // 蓝牙
    0, // WiFi
    0, // 电量
    0, // 警告
    0, // 模式
    0, // 难度
    0, // 速度
    0, // 音量
    0, // 开关
    0, // SD
    0, // 充电状态
    0, // 同步状态
    0, // 充电状态
};

//------------------------------------------------------------------------------

// 串口任务函数
void serialTask1(void *pvParameters)
{
    int previous_data[6] = {0}; // 存放上一次接收的数据
    while (1)
    {
        if (Serial4.available())
        {
            // 等待帧头
            if (Serial4.read() == 0xAA)
            {
                int data[6];                                   // 存放接收的数据
                Serial4.readBytes((char *)data, sizeof(data)); // 读取整数数据

                // 读取帧尾
                if (Serial4.read() == 0xBB)
                {
                    bool data_changed = false;
                    for (int i = 0; i < 6; i++)
                    {
                        if (data[i] != previous_data[i])
                        {
                            data_changed = true;
                            break;
                        }
                    }

                    if (data_changed)
                    {
                        level_difficulty_g = data[0]; // 难度
                        speed_set(data[1]);           // 速度
                        beepLevel_g = data[2];        // 音量
                        speaker_g = data[3];          // 开关
                        mode_g = data[5];             // 模式
                        //                        if(data[4]==1){
                        //                            Serial.println("正在格式化 SD 卡...");
                        //                            if (sd.format()) {
                        //                                Serial.println("格式化成功！");
                        //                            } else {
                        //                                Serial.println("格式化失败！");
                        //                            }
                        //                        }
                        playBuzzer(beepLevel_g, 100, 50);
                        savePreferences();
                        // 更新上一次接收的数据
                        for (int i = 0; i < 6; i++)
                        {
                            previous_data[i] = data[i];
                        }
                    }
                }
            }
        }

        vTaskDelay(50 / portTICK_PERIOD_MS);
    }
}

void serialTask2(void *pvParameters)
{
    pinMode(endstop_X, 37);
    // 只读取状态，不修改状态
    data22[0] = button_state;      // 编码器单击状态
    data22[2] = button_state2;     // 编码器双击状态
    data22[3] = deviceConnected_g; // 蓝牙状态
    data22[4] = wifi_status_g;     // wifi状态
    data22[5] = batteryLevel_g;    // 电量
    data22[7] = mode_g;
    data22[8] = level_difficulty_g;  // 难度
    data22[9] = get_current_speed(); // 速度
    data22[10] = beepLevel_g;        // 音量
    data22[11] = speaker_g;          // 开关
    data22[14] = 1;
    Serial4.write(0xAA); // 发送帧头
    Serial4.write((byte *)data22, sizeof(data22));
    Serial4.write(0xBB); // 发送帧尾
    data22[14] = 0;

    while (1)
    {
        // 检查是否为偶数（正负通用）
        if (encoderValue % 2 == 0)
        {
            data22[1] = encoderValue;
            //Serial.println(encoderValue);
        }

        // 只读取状态，不修改状态
        data22[0] = button_state;        // 编码器单击状态
        data22[2] = button_state2;       // 编码器双击状态
        data22[3] = deviceConnected_g;   // 蓝牙状态
        data22[4] = wifi_status_g;       // wifi状态
        data22[5] = batteryLevel_g;      // 电量
        data22[8] = level_difficulty_g;  // 难度
        data22[9] = get_current_speed(); // 速度
        data22[10] = beepLevel_g;        // 音量
        data22[11] = speaker_g;          // 开关
        data22[14] = isSyncing;          // 同步状态
        data22[15] = Charging_status;    // 充电状态

        Serial4.write(0xAA); // 发送帧头
        Serial4.write((byte *)data22, sizeof(data22));
        Serial4.write(0xBB); // 发送帧尾

        // 不再在这里重置button_state和button_state2，
        // 这些状态现在由事件处理系统在handleButtonEvent()中管理
        data22[14] = 0; // 只重置同步标志
        
        vTaskDelay(100 / portTICK_PERIOD_MS);
    }
}

void serial_screen_init()
{
    Serial4.begin(921600, SERIAL_8N1, 18, 8); // 设置串口波特率为115200，数据位为8位，奇偶校验位为无，停止位为1位，RX引脚为16，TX引脚为17

    TaskHandle_t taskHandle1 = NULL;
    TaskHandle_t taskHandle2 = NULL;

    // 创建 FreeRTOS 任务1
    xTaskCreatePinnedToCore(
        serialTask1,   // 任务函数
        "SerialTask1", // 任务名称
        4096,          // 栈大小（4KB）
        NULL,          // 任务参数
        1,             // 优先级（1 低，5 高）
        &taskHandle1,  // 任务句柄
        1              // 运行在核心 1
    );

    // 创建 FreeRTOS 任务2
    xTaskCreatePinnedToCore(
        serialTask2,   // 任务函数
        "SerialTask2", // 任务名称
        4096,          // 栈大小（4KB）
        NULL,          // 任务参数
        1,             // 优先级（1 低，5 高）
        &taskHandle2,  // 任务句柄
        1              // 运行在核心 1
    );
}